package io.github.loan.common.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.springframework.stereotype.Component;

/**
 * 文件工具类
 * 
 * @author wangshSxt
 *
 */
@Component("fileUtil")
public class FileUtil {
	/**
	 * 复制文件
	 * 
	 * @param sourceFile
	 * @param targetFile
	 * @return
	 */
	public boolean copy(File sourceFile, File targetFile) {
		if (!targetFile.getParentFile().exists()) {
			targetFile.getParentFile().mkdirs();
		}

		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		try {
			bis = new BufferedInputStream(new FileInputStream(sourceFile));
			bos = new BufferedOutputStream(new FileOutputStream(targetFile));
			return this.copy(bis, bos);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				bos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				bis.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return false;
	}

	/**
	 * 复制文件
	 * 
	 * @param sourceFile
	 * @param targetFile
	 * @return
	 */
	public boolean copy(InputStream is, OutputStream os) {
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		try {
			bis = new BufferedInputStream(is);
			bos = new BufferedOutputStream(os);
			byte[] b = new byte[1024];
			int len = 0;
			while ((len = bis.read(b)) != -1) {
				bos.write(b, 0, len);
			}
			return true;
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				bos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				bis.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return false;
	}

	/**
	 * 以树形结构展现一个文件夹
	 * 
	 * @param souFile
	 */
	public void tree(File souFile) {
		System.out.println("============");
		this.treeUtil(souFile, 0);
	}

	/**
	 * 树形结构的递归 ~肯定是自己调用自己 ~得满足一定条件才能自己调用自己,否则出不来 ~参数必须得发生变化,否则调用相当于白调
	 * ~名称前面加上表示级别的字符串;如何让层级动起来; ~传参(用来存储信息)
	 */
	public void treeUtil(File tempFile, int level) {
		/**
		 * 前面的树形结构层级:
		 */
		String preStr = "";
		for (int i = 0; i < level; i++) {
			preStr += "|-->";
		}
		System.out.println(preStr + tempFile.getName());
		if (tempFile.isDirectory()) {
			/* 列出当前文件夹下面的文件或者文件夹 */
			File[] files = tempFile.listFiles();
			for (int i = 0; i < files.length; i++) {
				File file = files[i];
				/*
				 * 什么情况下,需要自己调用自己 只有是文件夹的时候才调用自己
				 * 参数:传递的应该是当前文件夹下面的文件;如果传的还是当前文件;(相当于递归木有调用)
				 */
				this.treeUtil(file, level + 1);
			}
		}
	}

	public static void main(String[] args) {
		File souFile = new File("D:/项目空间/405_20161031/框架");
		FileUtil fileUtil = new FileUtil();
		fileUtil.tree(souFile);
	}
}
